/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package chess;
/*
 * Interfaz.java
 *
 */


import java.awt.Color;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import pgnparse.PGNSource;

/**
 *
 */
public class Busqueda extends javax.swing.JFrame {

    int n, size;
    JButton [][] board;  
    Token [][] tokens;
    Connection conn = null;
    int color = 0;
    String [] letras = new String [8];
    
    public Busqueda() {
        n = 8;
        size = 400/8;
        board= new JButton[8][8];
        tokens = new Token [n][n];
        letras[0]="a";letras[1]="b";letras[2]="c";
        letras[3]="d";letras[4]="e";letras[5]="f";
        letras[6]="g";letras[7]="h";
        initComponents();
        
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        Panel = new javax.swing.JLayeredPane();
        Juego = new PGNSource("");
        actual = -1;
        jugador = true;
        ImageIcon[] ficha = {new ImageIcon("caballo.gif"),
            new ImageIcon("reina.gif"),
            new ImageIcon("src/imagenes/Warcraft3034wallpapers.jpg")};
        jugadorBlanco = new javax.swing.JLabel();
        jugadorNegro = new javax.swing.JLabel();
        elo1 = new javax.swing.JLabel();
        elo2 = new javax.swing.JLabel();
        locacion = new javax.swing.JLabel();
        ocasion = new javax.swing.JLabel();
        clasificacion = new javax.swing.JLabel();
        momento = new javax.swing.JLabel();
        numero = new javax.swing.JLabel();
        ganador = new javax.swing.JLabel();
        sol = new javax.swing.JLabel();
        lista = new javax.swing.JLabel();
        titulo = new javax.swing.JLabel();
        titulo2 = new javax.swing.JLabel();
        titulo3 = new javax.swing.JLabel();
        jugadores = new javax.swing.JLabel();
        blanco = new javax.swing.JTextField();
        lugarPartida = new javax.swing.JTextField();
        eventoPartida = new javax.swing.JTextField();
        eloBlanco = new javax.swing.JTextField();
        ecoPartida = new javax.swing.JTextField();
        eloNegro = new javax.swing.JTextField();
        rondaPartida = new javax.swing.JTextField();
        resultadoPartida = new javax.swing.JTextField();
        fechaPartida = new javax.swing.JTextField();
        negro = new javax.swing.JTextField();
        jugador1 = new javax.swing.JTextField();
        jugador2 = new javax.swing.JTextField();
        textoFecha = new javax.swing.JTextField();
        textoEvento = new javax.swing.JTextField();
        textoLugar = new javax.swing.JTextField();
        textoResultado = new javax.swing.JTextField();
        textoRonda = new javax.swing.JTextField();
        textoElo1 = new javax.swing.JTextField();
        textoEco = new javax.swing.JTextField();
        textoElo2 = new javax.swing.JTextField();
        lugar = new javax.swing.JLabel();
        evento = new javax.swing.JLabel();
        fecha = new javax.swing.JLabel();
        ronda = new javax.swing.JLabel();
        resultado = new javax.swing.JLabel();
        resultados = new javax.swing.JList();
        elo = new javax.swing.JLabel();
        eco = new javax.swing.JLabel();
        cerrar = new javax.swing.JButton();
        buscar = new javax.swing.JButton();
        editar = new javax.swing.JButton();
        borrar = new javax.swing.JButton();
        play = new javax.swing.JButton();
        stop = new javax.swing.JButton();
        forward = new javax.swing.JButton();
        jugadorBlanco.setText("White");
        jugadorNegro.setText("Black");
        elo1.setText("White Elo");
        elo2.setText("Black Elo");
        locacion.setText("Lugar");
        clasificacion.setText("ECO");
        ocasion.setText("Evento");
        momento.setText("Fecha");
        numero.setText("Ronda");
        ganador.setText("Resultado");
        sol.setText("listo");
        titulo.setText("Datos Busqueda");
        titulo2.setText("Resultados de Busqueda");
        titulo3.setText("Datos Partida Seleccionada");
        jugadores.setText("Jugadores");
        lugar.setText("Lugar");
        evento.setText("Evento");
        fecha.setText("Fecha");
        elo.setText("Elo Jugadores");
        eco.setText("ECO");
        resultado.setText("Resultado");
        ronda.setText("Ronda");
        jugadorBlanco.setBounds(510, 430, 100, 20);
        jugadorNegro.setBounds(660, 430, 100, 20);
        elo1.setBounds(470, 630, 100, 20);
        elo2.setBounds(470, 660, 100, 20);
        locacion.setBounds(470, 450, 100, 20);
        clasificacion.setBounds(470, 600, 100, 20);
        ocasion.setBounds(470, 480, 100, 20);
        momento.setBounds(470, 510, 100, 20);
        numero.setBounds(470, 540, 100, 20);
        ganador.setBounds(470, 570, 100, 20);
        jugadorBlanco.setForeground(Color.white);
        jugadorNegro.setForeground(Color.white);
        elo1.setForeground(Color.white);
        elo2.setForeground(Color.white);
        locacion.setForeground(Color.white);
        clasificacion.setForeground(Color.white);
        ocasion.setForeground(Color.white);
        momento.setForeground(Color.white);
        numero.setForeground(Color.white);
        ganador.setForeground(Color.white);
        lugar.setBounds(470, 110, 100, 20);
        lugar.setForeground(Color.white);
        evento.setBounds(470, 140, 100, 20);
        evento.setForeground(Color.white);
        fecha.setBounds(470, 170, 100, 20);
        fecha.setForeground(Color.white);
        elo.setBounds(470, 260, 100, 20);
        elo.setForeground(Color.white);

        eco.setBounds(470, 290, 100, 20);
        eco.setForeground(Color.white);
        resultado.setBounds(470, 200, 100, 20);
        scroll = new javax.swing.JScrollPane(resultados);
        scroll.setBounds(760, 80, 250, 450);
        resultado.setForeground(Color.white);
        resultados.addKeyListener(new java.awt.event.KeyAdapter() {
            @Override
            public void keyPressed(java.awt.event.KeyEvent ke) {
                if(ke.getKeyCode() == java.awt.event.KeyEvent.VK_DOWN){  
                    resultados.setSelectedIndex(resultados.getSelectedIndex()-1);
                }
                else if(ke.getKeyCode() == java.awt.event.KeyEvent.VK_UP){  
                    resultados.setSelectedIndex(resultados.getSelectedIndex()+1);
                }
            }
        });
        resultados.addMouseListener(new java.awt.event.MouseAdapter()
        {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent me)
            {
                String query = "SELECT * from Partidas WHERE Id = '"
                   +resultados.getSelectedValue().toString().substring(8) +"';";
                try{
                    Statement st = conn.createStatement();
                    ResultSet rs = st.executeQuery(query);
                    rs.next();
                    blanco.setText(rs.getString("White"));
                    lugarPartida.setText(rs.getString("Site"));
                    eventoPartida.setText(rs.getString("Event"));
                    eloBlanco.setText(rs.getString("WhiteElo"));
                    ecoPartida.setText(rs.getString("ECO"));
                    eloNegro.setText(rs.getString("BlackElo"));
                    rondaPartida.setText(rs.getString("Round"));
                    resultadoPartida.setText(rs.getString("Result"));
                    fechaPartida.setText(rs.getString("Date"));
                    negro.setText(rs.getString("Black"));
                    query = "SELECT * from Jugadas WHERE Partida = '"+
                    resultados.getSelectedValue().toString().substring(8) +"';";
                    Statement st2 = conn.createStatement();
                    ResultSet rs2 = st2.executeQuery(query);
                    query = "";
                    while(rs2.next()){
                        query = query + Integer.toString(rs2.getInt("NumeroJugada")) + "." + rs2.getString("Blanco") + " ";
                        if(!rs2.getString("ComentarioBlanco").isEmpty()){
                            query = query + "{" + rs2.getString("ComentarioBlanco") + "} ";
                        }
                        if(!rs2.getString("Negro").isEmpty() && !rs2.getString("Negro").equals("-")){
                            query = query + rs2.getString("Negro") + " ";
                        }
                        if(!rs2.getString("ComentarioNegro").isEmpty()){
                            query = query + "{" + rs2.getString("ComentarioNegro") + "} ";
                        }
                    }
                    query = query + rs.getString("Result");
                    Juego = new PGNSource(query);
                    actual = -1;
                    jugador = true;
                    color = 0;
                    for(int i=0;i<n;i++){
                        for(int j=0;j<n;j++){
                            board[j][i].setIcon(null);
                            tokens[j][i] = null;
                            if (i > 5){
                                color = 1;
                            }
                            if (i == 0 || i == 7){
                                if (j == 0 || j == 7){
                                    tokens[j][i] = new Rook (j,i,color,board,tokens);
                                }
                                if (j == 1 || j == 6){
                                    tokens[j][i] = new Knight (j,i,color,board,tokens);
                                }
                                if (j == 2 || j == 5){
                                    tokens[j][i] = new Bishop (j,i,color,board,tokens);
                                }
                                if (j == 3){
                                    tokens[j][i] = new Queen (j,i,color,board,tokens);
                                }
                                if (j == 4){
                                    tokens[j][i] = new King (j,i,color,board,tokens);
                                }
                            }
                            if (i == 1 || i == 6){
                                tokens[j][i] = new Pawn (j,i,color,board,tokens);
                            }
                        }
                    }
                }
                catch(Exception e){
                    System.out.println("Error conexion");
                }
            }
        });
        
        ronda.setBounds(470, 230, 100, 20);
        ronda.setForeground(Color.white);
        sol.setBounds(50, 500, 700, 23);
        sol.setForeground(Color.white);
        titulo.setBounds(550, 50, 200, 20);
        titulo2.setBounds(800, 50, 200, 20);
        titulo3.setBounds(510, 370, 200, 20);
        jugador1.setBounds(580, 80, 70, 20);
        jugador2.setBounds(660, 80, 70, 20);
        textoLugar.setBounds(580, 110, 70, 20);
        textoEvento.setBounds(580, 140, 70, 20);
        textoFecha.setBounds(580, 170, 70, 20);
        textoResultado.setBounds(580, 200, 70, 20);
        textoRonda.setBounds(580, 230, 70, 20);
        textoElo1.setBounds(580, 260, 70, 20);
        textoEco.setBounds(580, 290, 70, 20);
        textoElo2.setBounds(660, 260, 70, 20);
        blanco.setBounds(470, 400, 120, 20);
        lugarPartida.setBounds(560, 450, 180, 20);
        eventoPartida.setBounds(560, 480, 180, 20);
        eloBlanco.setBounds(560, 630, 180, 20);
        ecoPartida.setBounds(560, 600, 180, 20);
        eloNegro.setBounds(560, 660, 180, 20);
        rondaPartida.setBounds(560, 540, 180, 20);
        resultadoPartida.setBounds(560, 570, 180, 20);
        resultadoPartida.setEditable(false);
        fechaPartida.setBounds(560, 510, 180, 20);
        negro.setBounds(620, 400, 120, 20);
        titulo.setForeground(Color.white);
        titulo3.setForeground(Color.white);
        titulo2.setForeground(Color.white);
        jugadores.setBounds(470, 80, 100, 20);
        jugadores.setForeground(Color.white);
        Panel.add(sol, new Integer(0));
        Panel.add(titulo);
        Panel.add(clasificacion);
        Panel.add(titulo2);
        Panel.add(titulo3);
        Panel.add(blanco);
        Panel.add(lugarPartida);
        Panel.add(eventoPartida);
        Panel.add(eloBlanco);
        Panel.add(ecoPartida);
        Panel.add(eloNegro);
        Panel.add(rondaPartida);
        Panel.add(resultadoPartida);
        Panel.add(fechaPartida);
        Panel.add(negro);
        Panel.add(evento);
        Panel.add(fecha);
        Panel.add(textoRonda);
        Panel.add(textoResultado);
        Panel.add(textoElo1);
        Panel.add(textoEco);
        Panel.add(textoElo2);
        Panel.add(textoFecha);
        Panel.add(textoLugar);
        Panel.add(textoEvento);
        Panel.add(jugadorBlanco);
        Panel.add(jugadorNegro);
        Panel.add(elo1);
        Panel.add(elo2);
        Panel.add(locacion);
        Panel.add(ocasion);
        Panel.add(momento);
        Panel.add(numero);
        Panel.add(ganador);
        Panel.add(resultado);
        Panel.add(scroll);
        Panel.add(elo);
        Panel.add(eco);
        Panel.add(ronda);
        Panel.add(lugar);
        Panel.add(jugadores);
        Panel.add(jugador1);
        Panel.add(jugador2);
        lista.setBounds(0, 0, 1024, 768);
        lista.setIcon(ficha[2]);
        Panel.add(lista, javax.swing.JLayeredPane.DEFAULT_LAYER);

        cerrar.setText("Cerrar");
        cerrar.setForeground(Color.white);
        cerrar.setBackground(Color.black);
        cerrar.setBounds(833, 635, 100, 25);
        Panel.add(cerrar, new Integer(1));
        
        play.setText("Play");
        play.setForeground(Color.white);
        play.setBackground(Color.black);
        play.setBounds(250, 465, 80, 25);
        Panel.add(play, new Integer(1));
        
        stop.setText("Stop");
        stop.setForeground(Color.white);
        stop.setBackground(Color.black);
        stop.setBounds(160, 465, 80, 25);
        Panel.add(stop, new Integer(1));
        
        forward.setText("Siguiente");
        forward.setForeground(Color.white);
        forward.setBackground(Color.black);
        forward.setBounds(340, 465, 110, 25);
        Panel.add(forward, new Integer(1));
        
        buscar.setText("Buscar");
        buscar.setForeground(Color.white);
        buscar.setBackground(Color.black);
        buscar.setBounds(510, 325, 200, 25);
        Panel.add(buscar, new Integer(1));
        
        editar.setText("Editar");
        editar.setForeground(Color.white);
        editar.setBackground(Color.black);
        editar.setBounds(833, 545, 100, 25);
        Panel.add(editar, new Integer(1));
        
        borrar.setText("Borrar");
        borrar.setForeground(Color.white);
        borrar.setBackground(Color.black);
        borrar.setBounds(833, 590, 100, 25);
        Panel.add(borrar, new Integer(1));

        cerrar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                dispose();
            }
        });
        
        jugada = new Timer(2000, new java.awt.event.ActionListener () 
        { 
            public void actionPerformed(java.awt.event.ActionEvent ev) 
            { 
                try {
                if (!Juego.listGames().isEmpty()){
                    actual++;
                try {
                    String from = Juego.listGames().get(0).getMove(actual)
                            .getFromSquare();
                    String to = Juego.listGames().get(0).getMove(actual).getToSquare();
                    int x1, y1, x2, y2;
                    if (from==null){
                        String enroque = Juego.listGames().get(0).getMove(actual).getFullMove();
                        if (enroque.equals("O-O")){
                            x1 = 4;
                            y1 = 7*((1+actual)%2);
                            x2 = 7;
                            y2 = 7*((1+actual)%2);
                        }
                        else{
                            x1 = 4;
                            y1 = 7*((1+actual)%2);
                            x2 = 0;
                            y2 = 7*((1+actual)%2);
                        }
                    }
                    else{
                        x1 = decode(Character.toString(from.charAt(0)));//
                        y1 = 8 - Character.digit(from.charAt(1),10);
                        x2 = decode(Character.toString(to.charAt(0)));//
                        y2 = 8 - Character.digit(to.charAt(1),10);
                    }
                    tokens[x1][y1].moveToken(x2, y2);
                    int F = tokens[x1][y1].getRow();
                    int C = tokens[x1][y1].getColumn();
                    tokens[C][F] = tokens[x1][y1];
                    tokens[x1][y1] = null;
                    if (Juego.listGames().get(0).getMove(actual).getPromotion() != null){
                        if (Juego.listGames().get(0).getMove(actual).getPromotion().equals("Q")){
                            tokens[C][F] = new Queen (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                        else if (Juego.listGames().get(0).getMove(actual).getPromotion().equals("B")){
                            tokens[C][F] = new Bishop (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                        else if (Juego.listGames().get(0).getMove(actual).getPromotion().equals("R")){
                            tokens[C][F] = new Rook (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                        else{
                            tokens[C][F] = new Knight (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                    }
                } catch (Exception ex) {
                    jugada.stop();
                    JOptionPane.showMessageDialog(null, "Ha llegado al final de la partida", "Final Partida", JOptionPane.INFORMATION_MESSAGE);
                }
                }
                } catch (Exception e) {
                    jugada.stop();
                    JOptionPane.showMessageDialog(null, "No ha seleccionado una partida", "Error", JOptionPane.ERROR_MESSAGE);
                }
            
             } 
        }); 
        
        play.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jugada.start();
            }
        });
        
        stop.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jugada.stop();
            }
        });
        
        
        
        forward.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                if (!Juego.listGames().isEmpty()){
                    actual++;
                try {
                    String from = Juego.listGames().get(0).getMove(actual).getFromSquare();
                    String to = Juego.listGames().get(0).getMove(actual).getToSquare();
                    int x1, y1, x2, y2;
                    if (from==null){
                        String enroque = Juego.listGames().get(0).getMove(actual).getFullMove();
                        if (enroque.equals("O-O")){
                            x1 = 4;
                            y1 = 7*((1+actual)%2);
                            x2 = 7;
                            y2 = 7*((1+actual)%2);
                        }
                        else{
                            x1 = 4;
                            y1 = 7*((1+actual)%2);
                            x2 = 0;
                            y2 = 7*((1+actual)%2);
                        }
                    }
                    else{
                        x1 = decode(Character.toString(from.charAt(0)));//
                        y1 = 8 - Character.digit(from.charAt(1),10);
                        x2 = decode(Character.toString(to.charAt(0)));//
                        y2 = 8 - Character.digit(to.charAt(1),10);
                    }
                    tokens[x1][y1].moveToken(x2, y2);
                    int F = tokens[x1][y1].getRow();
                    int C = tokens[x1][y1].getColumn();
                    tokens[C][F] = tokens[x1][y1];
                    tokens[x1][y1] = null;
                    if (Juego.listGames().get(0).getMove(actual).getPromotion() != null){
                        if (Juego.listGames().get(0).getMove(actual).getPromotion().equals("Q")){
                            tokens[C][F] = new Queen (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                        else if (Juego.listGames().get(0).getMove(actual).getPromotion().equals("B")){
                            tokens[C][F] = new Bishop (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                        else if (Juego.listGames().get(0).getMove(actual).getPromotion().equals("R")){
                            tokens[C][F] = new Rook (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                        else{
                            tokens[C][F] = new Knight (C,F,tokens[C][F].getColor(),board,tokens);
                        }
                    }
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Ha llegado al final de la partida", "Final Partida", JOptionPane.INFORMATION_MESSAGE);
                }
                }
                } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "No ha seleccionado una partida", "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
            
            

            
        });

        borrar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String query = "DELETE FROM Partidas WHERE Id="+resultados.getSelectedValue().toString().substring(8) +";";
                Statement st;
                try {
                    st = conn.createStatement();
                    st.executeUpdate(query);
                    query = "DELETE FROM Jugadas WHERE Partida="+resultados.getSelectedValue().toString().substring(8) +";";
                    st = conn.createStatement();
                    st.executeUpdate(query);
                    resultados.setListData(new String[]{""});
                    blanco.setText("");
                    lugarPartida.setText("");
                    eventoPartida.setText("");
                    eloBlanco.setText("");
                    ecoPartida.setText("");
                    eloNegro.setText("");
                    rondaPartida.setText("");
                    resultadoPartida.setText("");
                    fechaPartida.setText("");
                    negro.setText("");
                    Juego = new PGNSource("");
                    actual = -1;
                    JOptionPane.showMessageDialog(null, "Se ha borrado la partida con exito", "Operacion Finalizada", JOptionPane.INFORMATION_MESSAGE);
                }
                catch(Exception ex){
                    Logger.getLogger(Busqueda.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        
        editar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String[] datos = new String[9];
                datos[0] = blanco.getText();
                datos[2] = lugarPartida.getText();
                datos[3] = eventoPartida.getText();
                datos[7] = eloBlanco.getText();
                datos[6] = ecoPartida.getText();
                datos[8] = eloNegro.getText();
                datos[4] = rondaPartida.getText();
                datos[5] = fechaPartida.getText();
                datos[1] = negro.getText();
                if (datos[0].equals("") || datos[0].equals("?") || datos[1].equals("") || datos[1].equals("?")){
                    JOptionPane.showMessageDialog(null, "La partida debe contener 2 jugadores", "Error", JOptionPane.ERROR_MESSAGE);
                }
                else{
                    datos[0] = datos[0].replace("'", " ");
                    datos[1] = datos[1].replace("'", " ");
                    if (datos[2].isEmpty()){
                        datos[2] = "?";
                    }
                    else{
                        datos[2] = datos[2].replace("'", " ");
                    }
                    if (datos[3].isEmpty()){
                        datos[3] = "?";
                    }
                    else{
                        datos[3] = datos[3].replace("'", " ");
                    }
                    if (datos[4].isEmpty()){
                        datos[4] = "?";
                    }
                    else{
                        datos[4] = datos[4].replace("'", " ");
                    }
                    if (datos[5].isEmpty()){
                        datos[5] = "?";
                    }
                    else{
                        datos[5] = datos[5].replace("'", " ");
                    }
                    if (datos[6].isEmpty()){
                        datos[6] = "?";
                    }
                    else{
                        datos[6] = datos[6].replace("'", " ");
                    }
                    if (datos[7].isEmpty()){
                        datos[7] = "?";
                    }
                    else{
                        datos[7] = datos[7].replace("'", " ");
                    }
                    if (datos[8].isEmpty()){
                        datos[8] = "?";
                    }
                    else{
                        datos[8] = datos[8].replace("'", " ");
                    }
                    String query = "UPDATE Partidas SET White='"+datos[0]+"', Black='"+datos[1]+"', Site='"+datos[2]+
                            "', Event='"+datos[3]+"', Round='"+datos[4]+"', Date='"+datos[5]+"', ECO='"+datos[6]+"', WhiteElo='"+
                            datos[7]+"', BlackElo='"+datos[8]+"' WHERE Id="+resultados.getSelectedValue().toString().substring(8) +";";
                    Statement st;
                    try {
                        st = conn.createStatement();
                        st.executeUpdate(query);
                    } catch (SQLException ex) {
                        Logger.getLogger(Busqueda.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });
        
        buscar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                Conexion connect = new Conexion();
                conn = connect.startConnection();
                String[] data = new String[]{""};
                resultados.setListData(data);
                String query = "SELECT Id from Partidas WHERE";
                if (!jugador1.getText().isEmpty() && !jugador2.getText().isEmpty()){
                    query = query + " (White = '"+jugador1.getText()+"' and Black = '"+jugador2.getText()+"') or (Black = '"+jugador1.getText()+"' and White = '"+jugador2.getText()+"') and";
                }
                else if (!jugador1.getText().isEmpty()){
                    query = query + " (White = '"+jugador1.getText()+"' or Black = '"+jugador1.getText()+"') and";
                }
                else if (!jugador2.getText().isEmpty()){
                    query = query + " (White = '"+jugador2.getText()+"' or Black = '"+jugador2.getText()+"') and";
                }
                if (!textoFecha.getText().isEmpty()){
                    query = query + " Date = '"+textoFecha.getText()+"' and";
                }
                if (!textoResultado.getText().isEmpty()){
                    query = query + " Result = '"+textoResultado.getText()+"' and";
                }
                if (!textoRonda.getText().isEmpty()){
                    query = query + " Round = '"+textoRonda.getText()+"' and";
                }
                if (!textoEco.getText().isEmpty()){
                    query = query + " ECO = '"+textoEco.getText()+"' and";
                }
                if (!textoLugar.getText().isEmpty()){
                    query = query + " Site = '"+textoLugar.getText()+"' and";
                }
                if (!textoEvento.getText().isEmpty()){
                    query = query + " Event = '"+textoEvento.getText()+"' and";
                }
                if (!textoElo1.getText().isEmpty() && !textoElo2.getText().isEmpty()){
                    query = query + " (WhiteElo = '"+textoElo1.getText()+"' and BlackElo = '"+textoElo2.getText()+"') or (BlackElo = '"+textoElo1.getText()+"' and WhiteElo = '"+textoElo2.getText()+"') and";
                }
                else if (!textoElo1.getText().isEmpty()){
                    query = query + " (WhiteElo = '"+textoElo1.getText()+"' or BlackElo = '"+textoElo1.getText()+"') and";
                }
                else if (!textoElo2.getText().isEmpty()){
                    query = query + " (WhiteElo = '"+textoElo2.getText()+"' or BlackElo = '"+textoElo2.getText()+"') and";
                }
                if (query.endsWith("and")){
                    query = query.substring(0, query.length()-4) + ";";
                }
                else{
                    query = query.substring(0, query.length()-6) + ";";
                }
                try{
                    Statement st = conn.createStatement();
                    ResultSet rs = st.executeQuery(query);
                    if (rs.last()){
                        data = new String[rs.getRow()];
                        rs.beforeFirst();
                    }
                    int index = 0;
                    while (rs.next()){
                        String id = "Partida " + Integer.toString(rs.getInt("Id")) + "\n";
                        data[index] = id;
                        index++;
                    }
                    resultados.setListData(data);
                    Juego = new PGNSource("");
                    actual = -1;
                }
                catch(Exception e){
                    System.out.println("Error conexion");
                }
            }
        });
        button = new javax.swing.JButton();

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                button = new javax.swing.JButton();
                button.setBounds(j*size+size, i*size+size, size, size);  
                Panel.add(button, new Integer(1));
                board[j][i]=button;
                if ((i%2==0&&j%2==0)||(i%2!=0&&j%2!=0)){ 
                    button.setBackground(Color.red.darker());
                    if (i > 3){
                        button.setBackground(Color.GREEN.darker());
                    }
                }
                else{
                    button.setBackground(Color.black);
                }

                if (i > 5){
                    color = 1;
                }
                if (i == 0 || i == 7){
                    if (j == 0 || j == 7){
                        tokens[j][i] = new Rook (j,i,color,board,tokens);
                    }
                    if (j == 1 || j == 6){
                        tokens[j][i] = new Knight (j,i,color,board,tokens);
                    }
                    if (j == 2 || j == 5){
                        tokens[j][i] = new Bishop (j,i,color,board,tokens);
                    }
                    if (j == 3){
                        tokens[j][i] = new Queen (j,i,color,board,tokens);
                    }
                    if (j == 4){
                        tokens[j][i] = new King (j,i,color,board,tokens);
                    }
                }
                if (i == 1 || i == 6){
                    tokens[j][i] = new Pawn (j,i,color,board,tokens);
                }
            }
        }

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Panel, javax.swing.GroupLayout.PREFERRED_SIZE, 1024, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Panel, javax.swing.GroupLayout.PREFERRED_SIZE, 768, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
    }// </editor-fold>
    
    private int decode(String entry) {
        for (int i = 0; i < letras.length; i++){
            if (entry.equals(letras[i])){
                return i;
            }
        }
        return 0;
    }


    private javax.swing.JLayeredPane Panel;
    private javax.swing.JButton button;
    private javax.swing.JLabel sol;
    private javax.swing.JLabel lista;
    private javax.swing.JLabel titulo;
    private javax.swing.JLabel titulo2;
    private javax.swing.JLabel titulo3;
    private javax.swing.JLabel jugadores;
    private javax.swing.JLabel jugadorBlanco;
    private javax.swing.JLabel jugadorNegro;
    private javax.swing.JLabel elo1;
    private javax.swing.JLabel elo2;
    private javax.swing.JLabel locacion;
    private javax.swing.JLabel ocasion;
    private javax.swing.JLabel momento;
    private javax.swing.JLabel numero;
    private javax.swing.JLabel ganador;
    private javax.swing.JLabel clasificacion;
    private javax.swing.JLabel lugar;
    private javax.swing.JLabel evento;
    private javax.swing.JLabel fecha;
    private javax.swing.JLabel ronda;
    private javax.swing.JLabel resultado;
    private javax.swing.JList resultados;
    private javax.swing.JLabel elo;
    private javax.swing.JLabel eco;
    private javax.swing.JButton cerrar;
    private javax.swing.JButton buscar;
    private javax.swing.JButton editar;
    private javax.swing.JButton borrar;
    private javax.swing.JButton play;
    private javax.swing.JButton stop;
    private javax.swing.JButton forward;
    private javax.swing.JTextField jugador1;
    private javax.swing.JTextField textoLugar;
    private javax.swing.JTextField textoEvento;
    private javax.swing.JTextField textoElo1;
    private javax.swing.JTextField textoEco;
    private javax.swing.JTextField textoElo2;
    private javax.swing.JTextField textoRonda;
    private javax.swing.JTextField textoResultado;
    private javax.swing.JTextField textoFecha;
    private javax.swing.JTextField jugador2;
    private javax.swing.JTextField blanco;
    private javax.swing.JTextField lugarPartida;
    private javax.swing.JTextField eventoPartida;
    private javax.swing.JTextField eloBlanco;
    private javax.swing.JTextField ecoPartida;
    private javax.swing.JTextField eloNegro;
    private javax.swing.JTextField rondaPartida;
    private javax.swing.JTextField resultadoPartida;
    private javax.swing.JTextField fechaPartida;
    private javax.swing.JTextField negro;
    private PGNSource Juego;
    int actual;
    private javax.swing.JScrollPane scroll;
    boolean jugador;
    Timer jugada;

    // End of variables declaration

}